package cz.pecinovsky.česky.oopnz._134_;
//Příliš žluťoučký kůň úpěl ďábelské ódy

import cz.pecinovsky.česky.oopnz.správce.IPosuvný;
import cz.pecinovsky.česky.oopnz.správce.IMultiposuvný;
import cz.pecinovsky.česky.oopnz.správce.Kreslítko;
import cz.pecinovsky.česky.oopnz.správce.Multipřesouvač;
import cz.pecinovsky.česky.oopnz.správce.SprávcePlátna;


import static cz.pecinovsky.česky.oopnz._134_.Okruh_134_      .Okruh;
import static cz.pecinovsky.česky.oopnz._134_.PoleCesty_134_  .PoleCesty;


//import static cz.pecinovsky.česky.oopnz._134_.Okružní_135_      .Okružní;
////////////////////////////////////////////////////////////////////////////////
//%%+  +++++ Konec ignorovaného počátečního textu +++++
//%I+ 
//
//import cz.pecinovsky.česky.oopnz.správceplátna.IPosuvný;
//import cz.pecinovsky.česky.oopnz.správceplátna.IMultiposuvný;
//import cz.pecinovsky.česky.oopnz.správceplátna.Kreslítko;
//import cz.pecinovsky.česky.oopnz.správceplátna.Multipřesouvač;
//import cz.pecinovsky.česky.oopnz.správceplátna.SprávcePlátna;
//%I-

import cz.pecinovsky.česky.oopnz.utility.Pozice;
//%X+ xxxxx Začátek přeskakovaného textu xxxxx
/*******************************************************************************
 *<pre>
 * Předchozí:   Není - toto_je_nově_definovaná_třída
 *              Ttt v projektu Ppp
 * Následující: Prozatím není
 *
 * Projekt  Ppp
 *   + Přidáno
 *   - Odebráno
 *   ~ Změněno
 *</pre>
 */
public class Okružní_135_
{    private Okružní_135_() {}   static
////////////////////////////////////////////////////////////////////////////////
//%X- ----- Konec přeskakovaného textu -----


/*******************************************************************************
 * Instance třídy {@code Okružní} představují dekorátory posuvných objektů,
 * které je dekorují schopností jezdit po okruhu.
 *
 * @author Rudolf PECINOVSKÝ
 * @version 6.03.2017 — 2010-11-08
 */
public class Okružní implements IMultiposuvný
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    /** Implicitní rychlost, kterou se objekty přesouvají. */
    private static final int IMPLICITNÍ_RYCHLOST = 100;

    /** Správce plátna, na němž budou objekty zobrazovány. */
    private static final SprávcePlátna SP = SprávcePlátna.getInstance();



//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    /** Dekorovaný objekt, kterým se bude objíždět nějaký okruh. */
    private final IPosuvný dekorovaný;



//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================

    /** Rychlost, kterou se objekt přesouvá. */
    private int rychlost = IMPLICITNÍ_RYCHLOST;

    /** Pole, ze kterého objekt naposledy "vyjel". */
    private PoleCesty pole;



//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vytvoří novou instanci obalující a dekorující zadaný posuvný objekt.
     *
     * @param dekorovaný Obalovaný a dekorovaný objekt
     */
    public Okružní(IPosuvný dekorovaný)
    {
        this.dekorovaný = dekorovaný;
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================

    /***************************************************************************
     * Vrátí přepravku se souřadnicemi instance.
     *
     * @return  Přepravka se souřadnicemi instance
     */
    @Override
    public Pozice getPozice()
    {
        return dekorovaný.getPozice();
    }


    /***************************************************************************
     * Nastaví novou pozici instance.
     *
     * @param pozice  Nová pozice instance
     */
    @Override
    public void setPozice(Pozice pozice)
    {
        dekorovaný.setPozice(pozice);
    }


    /***************************************************************************
     * Nastaví novou pozici instance.
     *
     * @param x   Nová x-ová pozice instance
     * @param y   Nová y-ová pozice instance
     */
    @Override
    public void setPozice(int x, int y)
    {
        dekorovaný.setPozice(x, y);
    }


    /***************************************************************************
     * Nastaví novou rychlost přesunu instance;
     * tato rychlost ale začne platit až od příštího startu.
     *
     * @param rychlost  Nastavovaná rychlost
     */
    public void setRychlost(int rychlost)
    {
        this.rychlost = rychlost;
    }



//%X+
    @Override public int getX() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    @Override public int getY() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
//%X-
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Prostřednictvím dodaného kreslítka vykreslí obraz své instance.
     *
     * @param kreslítko Kreslítko, které nakreslí instanci
     */
    @Override
    public void nakresli(Kreslítko kreslítko)
    {
        dekorovaný.nakresli(kreslítko);
    }


    /***************************************************************************
     * Přistaví dekorovaný objekt na zadaný okruh
     * a začne s ním tento okruh objíždět.
     *
     * @param okruh Okruh, který se má objíždět
     */
    public void objížděj(Okruh okruh)
    {
        PoleCesty start = okruh.getPočátek();
        pokračujZ(start);
    }


    /***************************************************************************
     * Přistaví dekorovaný objekt na zadané pole a vyjede s ním dál.
     *
     * @param pole Výchozí pole, ze kterého se bude pokračovat dál
     */
    public void pokračujZ(PoleCesty pole)
    {
        this.pole = pole;
        Pozice pozice = pole.getPozice();
        dekorovaný.setPozice(pozice);
        SP.přidej(this);
        přesunuto();
    }


    /***************************************************************************
     * Metoda vyvolaná multipřesouvačem poté, co dovedl svěřený objekt
     * do zadané cílové pozice. Při svém typickém použití metoda nastaví
     * novou cílovou pozici své instance a instanci opět předá multipřesouvači.
     */
    @Override
    public void přesunuto()
    {
        pole = pole.getDalší();
        Pozice pozice = pole.getPozice();
        Multipřesouvač m = Multipřesouvač.getInstance();
        m.přesuňRychlostí(rychlost, this, pozice);
    }


    /***************************************************************************
     * Vrací textovou reprezentaci (podpis) dané instance
     * používanou především k ladicím účelům.
     *
     * @return Požadovaná textová reprezentace
     */
    @Override
    public String toString()
    {
        return "Okružní_(" + dekorovaný.toString() + ")";
    }



//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        Okružní inst = new Okružní();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}

//%%-  ----- Začátek ignorovaného závěrečného textu -----
////////////////////////////////////////////////////////////////////////////////
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        System.exit(0);
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}
